Módulo 3: Histogramas + Box Plot


Tutorial

Imports


In [ ]:
import numpy as np
import os
import pandas as pd

In [ ]:
""" habilitando plots no notebook """
%matplotlib inline

In [ ]:
""" plot libs """
import matplotlib.pyplot as plt
import seaborn as sns

In [ ]:
""" Configurando o Matplotlib para o modo manual """
plt.interactive(False)

Dataset


In [ ]:
""" DataFrame contendo 5 Séries com Distribuições Normais distintas """
df = pd.DataFrame(
    columns=["S1", "S2", "S3", "S4", "S5"],
    data=(
        np.random.randn(100, 5) * np.array([10, 15, 50, 100, 200]) + np.array([0, 5, 30, 30, 50])
    )
)

Histogram Plot

Matplotlib Puro


In [ ]:
""" Histograma sem Normalização """
plt.figure(figsize=(12,8))

plt.hist(df.S1, bins=10)

plt.show()

In [ ]:
""" Histograma com Normalização """
plt.figure(figsize=(12,8))

plt.hist(df.S1, bins=10, normed=True)

plt.show()
df.S1.describe()

In [ ]:
""" Histograma de duas Séries """
plt.figure(figsize=(12,8))

plt.hist(df[["S1", "S2"]], bins=10, normed=True)

plt.show()
df[["S1", "S2"]].describe()

In [ ]:
""" Histograma de mais de duas Séries """
plt.figure(figsize=(12,8))

plt.hist(df, bins=10, normed=True)

plt.show()
df.describe()

Observação:

A visualização do histograma de várias séries é muito confusa usando o matplotlib sozinho. Às vezes é preferível usar uma visualização em uma janela só, como mostrada abaixo:


In [ ]:
plt.figure(figsize=(15,10))

plt.hist(df.S1, bins=10, normed=True, color="blue", alpha=0.5, label="S1")
plt.hist(df.S2, bins=10, normed=True, color="red", alpha=0.5, label="S2")
plt.legend()
plt.show()

Usando Pandas


In [ ]:
""" Uma Série """
df.S1.hist(bins=10, normed=True, figsize=(12,8))

plt.show()

In [ ]:
""" Histograma de duas Séries """
df[["S1", "S2"]].hist(bins=10, normed=True, figsize=(12,8))

plt.show()
df[["S1", "S2"]].describe()

In [ ]:
""" Histograma de mais de duas Séries """
df.hist(bins=10, figsize=(12,8))

plt.show()
df.describe()

Usando Seaborn


In [ ]:
""" Uma Série """
plt.figure( figsize=(12,8))

sns.distplot(df.S1)

plt.show()

Observação:

Seaborn não suporta hist plot de várias colunas de um DataFrame automaticamente


In [ ]:
""" Histograma de duas Séries (1) """
plt.figure( figsize=(12,8))

f, axes = plt.subplots(2, 1, figsize=(15, 8), sharex=True)

sns.distplot(df.S1, kde=False, color="blue", ax=axes[0])
sns.distplot(df.S2, kde=True, color="red", ax=axes[1])

plt.show()
df[["S1", "S2"]].describe()

In [ ]:
""" Histograma de duas Séries (1) """

f, axes = plt.subplots(1, 2, figsize=(15, 8), sharex=True)

sns.distplot(df.S1, kde=False, color="blue", ax=axes[0])
sns.distplot(df.S2, kde=True, color="red", ax=axes[1])

plt.show()
df[["S1", "S2"]].describe()

In [ ]:
""" Histograma de mais de duas Séries """

plt.figure( figsize=(12,8))

f, axes = plt.subplots(3, 2, figsize=(15, 8), sharex=True)

sns.distplot(df.S1, kde=False, color="blue", ax=axes[0, 0])
sns.distplot(df.S2, kde=True, color="red", ax=axes[0, 1])
sns.distplot(df.S3, kde=True, color="orange", ax=axes[1, 0])
sns.distplot(df.S4, kde=True, rug=True, color="gray", ax=axes[1, 1])
sns.distplot(df.S5, hist=False, kde_kws={"shade": True}, color="purple", ax=axes[2, 1])

plt.show()
df[["S1", "S2"]].describe()

Box Plot

Matplotlib Puro

Uma Série


In [ ]:
""" default: vertical """
plt.figure(figsize=(15,10))

plt.boxplot(df.S1)

plt.show()

In [ ]:
""" horizontal pra variar """

plt.figure(figsize=(15,10))

plt.boxplot(df.S1, vert=False)

plt.show()

Mais Séries


In [ ]:
plt.figure(figsize=(15,10))

plt.boxplot(df.T)

plt.show()

Outliers!!!


In [ ]:
tmp1 = df[["S1", "S2"]]
tmp2 = df[["S3", "S3"]]
tmp2.columns = tmp1.columns  # append com colunas iguais não cria NaNs 

tmp = tmp1.append(tmp2)

In [ ]:
plt.figure(figsize=(15,10))

plt.boxplot(tmp.T)

plt.show()
tmp.describe(percentiles=[0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9])

Pandas for the Go!

Todos Juntos e com Labels!


In [ ]:
df.plot(kind="box", figsize=(15,10))
plt.show()

Outliers!!!


In [ ]:
tmp1 = df.copy()
tmp2 = df[["S5", "S5", "S5", "S5", "S5"]]
tmp2.columns = tmp1.columns  # append com colunas iguais não cria NaNs 

tmp = tmp1.append(tmp2)

In [ ]:
plt.figure(figsize=(15,10))

tmp.plot(kind="box", figsize=(15,10))

plt.show()
tmp.describe(percentiles=[0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9])

Seaborn


In [ ]:
plt.figure(figsize=(15,10))

sns.boxplot(data=df)

plt.show()

Desafio

Objetivo:

Visualizar uma Distribuição Normal usando Histogramas e Box Plot

Dataset:


In [ ]:
serie_original = pd.Series(np.random.randn(900)) * 32 + 230 
outliers = pd.Series(np.random.randn(100)) * 320 + 230

[ A ] Exploração

Parte 1

Usar Histograma e Box Plot para visualizar:

  • a Série Original
  • os Outliers
  • a Série Original e os Outliers na mesma janela

In [ ]:
""" Escreva a a Solução Aqui """

Parte 2

Juntar a Série Original com os Outliers para criar uma Série Contaminada. Visualizar a nova série.

Depois, propor cortes na série para eliminar os outliers sem perder muitos dados de dentro da distribuição.

Em cada corte executado, visualizar a distribuição e as medidas de constrole da distribuição.


In [ ]:
""" Escreva a a Solução Aqui """

[ B ]

Criar um plot de duas janelas empilhadas na vertical, onde:

  • A janela de cima é um Box Plot horizontal
  • A Janela de baixo é um histograma

As duas janelas devem compartilhar o eixo horixontal, de forma que os atributos da distribuição estejam alinhados.


In [ ]:
""" Escreva a a Solução Aqui """